<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="dSD8Z" id="dSD8Z"><span data-lake-id="ubff9762f" id="ubff9762f">典型回答</span></h1>
  <p data-lake-id="uffbef631" id="uffbef631"><br></p>
  <p data-lake-id="u254256a1" id="u254256a1"><span data-lake-id="u6121a3ab" id="u6121a3ab">唯一索引和主键索引是数据库中两种常见的索引类型。他们之所以放在一起比较，是因为他们都需要保证唯一性。但是他们还是有很多区别的。</span></p>
  <p data-lake-id="uec2489f6" id="uec2489f6"><span data-lake-id="udbe6dc87" id="udbe6dc87">​</span><br></p>
  <p data-lake-id="uf4dc40cf" id="uf4dc40cf"><strong><span data-lake-id="uf492b1ca" id="uf492b1ca">唯一性</span></strong><span data-lake-id="u508f62f3" id="u508f62f3">：主键索引其实是一种特殊的唯一索引，他们都具有唯一性；也就是在一张表中，不能有两行有相同的主键；在同一张表中，主键索引字段的所有值都是唯一的。</span></p>
  <p data-lake-id="ubc149cd1" id="ubc149cd1"><span data-lake-id="u1f1f8e23" id="u1f1f8e23">​</span><br></p>
  <p data-lake-id="ubc6b86df" id="ubc6b86df"><strong><span data-lake-id="ubd019259" id="ubd019259">是否可空</span></strong><span data-lake-id="u21e727ba" id="u21e727ba">：主键索引是不能为NULL的，而唯一键索引是可以为NULL的。</span></p>
  <p data-lake-id="u95e44829" id="u95e44829"><span data-lake-id="u0ae0c52c" id="u0ae0c52c">​</span><br></p>
  <p data-lake-id="u6a431e79" id="u6a431e79"><strong><span data-lake-id="u673c98f9" id="u673c98f9">是否可以有多个</span></strong><span data-lake-id="u8ba45930" id="u8ba45930">：主键索引在一张表中只能有一个，而唯一索引在一张表中可以创建多个。</span></p>
  <p data-lake-id="u98310c67" id="u98310c67"><span data-lake-id="ube4f2e57" id="ube4f2e57">​</span><br></p>
  <p data-lake-id="u1ae13bb8" id="u1ae13bb8"><strong><span data-lake-id="ued937a81" id="ued937a81">索引结构</span></strong><span data-lake-id="ue8db32e4" id="ue8db32e4">：在InnoDB中，主键索引就是聚簇索引，而唯一索引通常是非聚簇索引。</span></p>
  <p data-lake-id="uc13fca55" id="uc13fca55"><span data-lake-id="u155db9e7" id="u155db9e7">​</span><br></p>
  <p data-lake-id="uc02fcd96" id="uc02fcd96"><span data-lake-id="ue6384b5e" id="ue6384b5e">为啥说唯一索引通常是非聚簇索引呢？</span></p>
  <p data-lake-id="u7de37ffa" id="u7de37ffa"><span data-lake-id="u24ba6263" id="u24ba6263">​</span><br></p>
  <p data-lake-id="ucbf10435" id="ucbf10435"><span data-lake-id="u1722ff2c" id="u1722ff2c">这是因为有的时候，我们可能没有创建主键索引，那么，MySQL会默认选择一个唯一的非空索引作为聚簇索引。所以，唯一索引也可能被选为聚簇索引。</span></p>
  <p data-lake-id="u84e6e680" id="u84e6e680"><span data-lake-id="u99c91775" id="u99c91775">​</span><br></p>
  <p data-lake-id="u7df02baa" id="u7df02baa"><span data-lake-id="uf310586e" id="uf310586e"><br></span><span data-lake-id="u002dcf33" id="u002dcf33">​</span></p>
  <p data-lake-id="u5b0acb1c" id="u5b0acb1c"><strong><span data-lake-id="u4ce134dc" id="u4ce134dc">是否回表</span></strong><span data-lake-id="u025f5f3b" id="u025f5f3b">：基于主键索引的查询一定不需要回表，基于唯一索引的查询，通常是需要回表的（这里的通常和上面的通常是一个事儿）</span></p>
  <p data-lake-id="u92038d07" id="u92038d07"><span data-lake-id="uc5315ba1" id="uc5315ba1">​</span><br></p>
  <p data-lake-id="u1225701e" id="u1225701e"><strong><span data-lake-id="u3fa0b8da" id="u3fa0b8da">外键：</span></strong><span data-lake-id="u22f93999" id="u22f93999">主键可以被其他表引用为外键，而唯一索引是不可以的。</span></p>
  <p data-lake-id="u1323b8fa" id="u1323b8fa"><span data-lake-id="u2ab8ef8f" id="u2ab8ef8f">​</span><br></p>
  <p data-lake-id="u060e72a5" id="u060e72a5"><span data-lake-id="uab2c9d0f" id="uab2c9d0f">​</span><br></p>
 </body>
</html>